using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using AEL.ACT;
using AEL.BOD;
using BEL;
using HER;

namespace DEL.BOD
{
    public class DO_Bod_Baja
    {

        #region Adapter
        private static CEL.BOD.DO_Bod_Baja _adpBod_Baja;
        private static CEL.BOD.DO_Bod_Baja adpBod_Baja
        {
            get
            {
                if (_adpBod_Baja == null)
                    _adpBod_Baja = new CEL.BOD.DO_Bod_Baja();
                return _adpBod_Baja;
            }
        }

        
        private static CEL.BOD.DO_Bod_Baja_Det _adpBod_Baja_Det;
        private static CEL.BOD.DO_Bod_Baja_Det adpBod_Baja_Det
        {
            get
            {
                if (_adpBod_Baja_Det == null)
                    _adpBod_Baja_Det = new CEL.BOD.DO_Bod_Baja_Det();
                return _adpBod_Baja_Det;
            }
        }

        private static CEL.BOD.DO_Bod_Orden _adpBod_Orden;
        private static CEL.BOD.DO_Bod_Orden adpBod_Orden
        {
            get
            {
                if (_adpBod_Orden == null)
                    _adpBod_Orden = new CEL.BOD.DO_Bod_Orden();
                return _adpBod_Orden;
            }
        }

        private static CEL.BOD.DO_Bod_Kardex _adpBod_Kardex;
        private static CEL.BOD.DO_Bod_Kardex adpBod_Kardex
        {
            get
            {
                if (_adpBod_Kardex == null)
                    _adpBod_Kardex = new CEL.BOD.DO_Bod_Kardex();
                return _adpBod_Kardex;
            }
        }

        #endregion

        #region Operaciones con datos
        public static void EmitirExcepcion(string mensaje, string caso)
        {
            Exception eCaso = new System.Exception(caso);
            Exception otroEX = new System.Exception(mensaje, eCaso);
            throw otroEX;
        }


        public static void Insert_Orden(Scope s, ref Bod_Baja p_Objeto)
        {            
            try
            {
                adpBod_Baja_Det.Adapter.BeginTransaction();
                adpBod_Orden.Adapter.Transaction = adpBod_Baja_Det.Adapter.Transaction;

                List<Bod_Baja_Det> lstBodBajaDet = adpBod_Baja_Det.GetByBaja(s, p_Objeto.Id);
                Bod_Orden bodOrden = null;
                foreach (Bod_Baja_Det bodBajaDet in lstBodBajaDet)
                {
                    bodOrden = new Bod_Orden();
                    bodOrden.Origen = "BAJ";
                    bodOrden.Tipo = "EGR";
                    bodOrden.Origen_Id = p_Objeto.Id;
                    bodOrden.Fecha_Creacion = DateTime.Now;
                    bodOrden.Creacion_Per_Personal_Id = s.Per_Personal_Id;
                    bodOrden.Fecha_Update = DateTime.Now;
                    bodOrden.Update_Per_Personal_Id = s.Per_Personal_Id;
                    bodOrden.Bod_Bodega_Id = p_Objeto.Bod_Bodega_Id;
                    bodOrden.Com_Articulo_Id = bodBajaDet.Com_Articulo_Id;
                    bodOrden.Cantidad = bodBajaDet.Cantidad;
                    bodOrden.Bod_Unidad_Id = bodBajaDet.Referencia_Bod_Unidad_Id;
                    bodOrden.Origen_Det_Id = bodBajaDet.Id;
                    bodOrden.Bod_Kardex_Id = null;
                    bodOrden.XML = p_Objeto.Bod_Baja_Motivo_Nombre;
                    bodOrden.Fecha = p_Objeto.Fecha;
                    
                        adpBod_Orden.Insert(s, bodOrden);
                        Bod_Baja_Det bodBajaDetNuevo = new Bod_Baja_Det(bodBajaDet);
                        bodBajaDetNuevo.Bod_Orden_Id = bodOrden.Id;
                        adpBod_Baja_Det.Update(s, bodBajaDetNuevo, bodBajaDet);
                   
                }
                adpBod_Baja_Det.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpBod_Baja_Det.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        public static void Insert_Kardex(Scope s, ref Bod_Baja p_Objeto)
        {
           try
            {
                adpBod_Orden.Adapter.BeginTransaction();
                
                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s, "BAJ", p_Objeto.Id);
                Bod_Kardex bodKardex = null;
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                    bodKardex = new Bod_Kardex();
                    bodKardex.Int_Empresa_Id = s.Int_Empresa_Id;
                    bodKardex.Bod_Bodega_Id = bodOrden.Bod_Bodega_Id;                   
                    bodKardex.Marca = "ABI";
                    bodKardex.Tipo = "EGR";
                    bodKardex.Fecha_Creacion = DateTime.Now;
                    bodKardex.Creacion_Per_Personal_Id = s.Per_Personal_Id;
                    bodKardex.Fecha_Update = DateTime.Now;
                    bodKardex.Update_Per_Personal_Id = s.Per_Personal_Id;
                    bodKardex.Com_Articulo_Id = bodOrden.Com_Articulo_Id;
                    bodKardex.Cantidad = bodOrden.Referencia_Cantidad;
                    bodKardex.Xml = bodOrden.Fecha_Creacion.ToString();
                    bodKardex.Fecha = p_Objeto.Fecha;
                   
                        DEL.BOD.DO_Bod_Kardex.Insert(s, ref bodKardex);
                        Bod_Orden nuevoObjeto = new Bod_Orden(bodOrden);
                        nuevoObjeto.Bod_Kardex_Id = bodKardex.Id;
                        adpBod_Orden.Update(s, nuevoObjeto, bodOrden);
                                   
                }
                adpBod_Orden.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpBod_Orden.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        public static void Delete_Kardex(Scope s, ref Bod_Baja p_Objeto)
        {
            try
            {
                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s,"BAJ",p_Objeto.Id);
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                    Bod_Orden nuevoObjeto = new Bod_Orden(bodOrden);
                    nuevoObjeto.Bod_Kardex_Id = null;
                    adpBod_Orden.Update(s, nuevoObjeto, bodOrden);

                    List<Bod_Kardex> lstbodKardex = adpBod_Kardex.GetById(s, bodOrden.Bod_Kardex_Id);
                    foreach (Bod_Kardex Bodkardex in lstbodKardex)
                    {
                        DEL.BOD.DO_Bod_Kardex.Delete(s, Bodkardex);
                    }                     
                }               
            }
            catch (Exception e)
            {
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }


        public static void Delete_Orden(Scope s, ref Bod_Baja p_Objeto)
        {
            try
            {
                

                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s,"BAJ",p_Objeto.Id);               
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                     
                     List<Bod_Baja_Det> lstBodBaja = adpBod_Baja_Det.GetByBaja(s, p_Objeto.Id);
                     foreach (Bod_Baja_Det bodBajaDet in lstBodBaja)
                     {
                         Bod_Baja_Det bodBajaDetNuevo = new Bod_Baja_Det(bodBajaDet);
                         bodBajaDetNuevo.Bod_Orden_Id = null;
                         adpBod_Baja_Det.Update(s, bodBajaDetNuevo, bodBajaDet);
                     }
                     adpBod_Orden.Delete(s, bodOrden);
                }
                
            }
            catch (Exception e)
            {
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        #endregion

        #region Obtencion de Datos

        static public List<Bod_Baja> GetByEmpresa(Scope s)
        {
            string filtroParaCEL;
            string[] campos = { "Estado =", "Fecha <=", "Fecha >=", "Bod_Bodega_Nombre LIKE" };
            FiltroDiccionario dic;
            int encontrados =
            Filtrado.AnalizarExpresionDeFiltrado(s.Expresion_De_Filtrado, campos, out dic, out filtroParaCEL);
            List<Bod_Baja> resultado;

            if (encontrados > 0)
            {
                s.Expresion_De_Filtrado = filtroParaCEL;

                string estado = "%";
                if (dic["Estado ="] != string.Empty)
                    estado += dic["Estado ="].Trim('\'');

                string bodBodegaNombre = "%";
                if (dic["Bod_Bodega_Nombre LIKE"] != string.Empty)
                    bodBodegaNombre = dic["Bod_Bodega_Nombre LIKE"].Trim('\'');

                DateTime fechaInicio = new DateTime(1900, 1, 1);
                if (dic["Fecha >="] != string.Empty)
                    fechaInicio = Convert.ToDateTime(dic["Fecha >="].Trim('\''));

                DateTime fechaFin = new DateTime(2079, 6, 6);
                if (dic["Fecha <="] != string.Empty)
                    fechaFin = Convert.ToDateTime(dic["Fecha <="].Trim('\''));

                resultado = adpBod_Baja.GetByEstado(s, estado, bodBodegaNombre, fechaInicio, fechaFin);
            }
            else
            {
                resultado = adpBod_Baja.GetByEmpresa(s);
            }

            return resultado;
        }
        #endregion


    }
}
